package com.sentinel.demo02.datasource;

import com.alibaba.csp.sentinel.datasource.Converter;
import com.alibaba.csp.sentinel.datasource.FileRefreshableDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.net.URL;
import java.util.List;

/**
 * trace debug info warn error fatal
 * 常用日志级别 debug info error
 * info级别日志： 启动必须输出的信息，比如tomcat输出端口 8080
 * 我们开发的时候，别写info，交给框架 底层api写info
 * debug级别日志： 调试日志 出错了，有故障了，通过debug 沿路寻找问题出处
 * 入参 debug
 * 出餐 debug
 * error级别日志: catch里写  打印的内容 符合捕获异常逻辑
 */
@Slf4j
public class MyFileDatasource implements InitFunc {
    //初始化加载的方法 ,可以在方法中根据需求实现代码
    //我们要读取的规则在 classpath:flowRules.json
    @Override
    public void init() throws Exception {
        //1. 找到flowRules.json 路径 d:/aaa/bbb/ccc/flowRules.json
        URL resource = MyFileDatasource.class.getClassLoader().getResource("flowRules.json");
        log.info("文件资源:{}",resource);
        String path = resource.getPath();
        log.info("文件路径:{}",path);
        //2. 利用sentinel的现成的api读取文件内容 生成一个fileDatasource(解析过json的数据格式)
        FileRefreshableDataSource<List<FlowRule>> myDatasource=
                new FileRefreshableDataSource<List<FlowRule>>(path,
                        new Converter<String, List<FlowRule>>() {
                            //入参是string 文件文本 json
                            //出参是FlowRule 转化的List泛型类型
                            @Override
                            public List<FlowRule> convert(String json) {
                                log.info("文本文件内容:{}",json);
                                //使用alibaba fastJson将json字符串转化成flowRule对象
                                return JSON.parseArray(json,FlowRule.class);
                            }
                        });
        //3. 利用数据源对象 将规则加载给当前程序的sentinel
        FlowRuleManager.register2Property(myDatasource.getProperty());
        log.info("当前自定义数据源被程序加载");
    }
}
